package com.duobaoyu.dby.supply.common.biz.remote.dto.refund;

import com.duobaoyu.dby.common.core.validator.phone.Phone;
import com.duobaoyu.dby.supply.common.biz.remote.dto.validation.constraints.AfterSaleValidationGroup;
import lombok.Data;

import javax.validation.Valid;
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotEmpty;
import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.util.List;

/**
 * @author liyang
 * @version 1.0.0
 * @ClassName AfterSaleApplyDTO
 * @Description 售后申请DTO
 * @createTime 16:36:00 2022/06/05
 */
@Data
public class AfterSaleApplyDTO implements Serializable {

    private static final long serialVersionUID = -253479050054235388L;

    /**
     * 供应链交易号
     */
    @NotBlank(message = "供应链交易号不能为空")
    private String supplyTradeSn;
    /**
     * 访问来源
     */
    @NotBlank(message = "访问来源不能为空")
    private String serverName;

    /**
     * 实际业务渠道
     */
    @NotBlank(message = "业务渠道不能为空")
    private String showServerName;
    /**
     * 业务方售后申请编号
     */
    @NotBlank(message = "业务方售后申请编号不能为空")
    private String bizAfterSaleSn;

    /**
     * 客户期望售后类型
     */
    @NotNull(message = "售后类型不能为空")
    private Integer afterSaleType;
    /**
     * 售后申请信息
     */
    @NotEmpty(message = "售后申请信息不能为空")
    @Valid
    private List<Content> contents;

    /**
     * 售后申请信息
     */
    @Data
    public static class Content {

        /**
         * 用户信息
         */
        @Valid
        @NotNull(message = "用户信息不能为空")
        private CustomerInfo customerInfo;

        /**
         * 订单编号
         */
        @NotBlank(message = "订单编号不能为空")
        private String orderSn;

        /**
         * 商品信息
         */
        private List<Sku> skus;
        /**
         * 取件信息
         */
        @Valid
        @NotNull(message = "取件信息必填", groups = {AfterSaleValidationGroup.PickUp.class})
        private PickupWareInfoDTO pickupWareInfo;
        /**
         * 返件信息
         */
        @Valid
        @NotNull(message = "返件信息必填", groups = {AfterSaleValidationGroup.ReturnWare.class})
        private ReturnWareInfoDTO returnWareInfo;
    }

    @Data
    public static class Sku {
        /**
         * 商品编码(SKU)
         */
        @NotBlank(message = "商品SKU编号不能为空")
        private String skuCode;

        /**
         * 商品申请数量
         */
        @NotNull(message = "商品申请数量不能为空")
        @Min(value = 1, message = "商品申请数量错误")
        private Integer applyNum;

        /**
         * 问题描述文字
         */
        private String questionDesc;

        /**
         * 问题描述图片，最多2000字符，支持多张图片，用逗号分隔（英文逗号）
         */
        private List<String> questionPic;

        /**
         * 是否收到货物
         */
        @NotNull(message = "是否收到货物不能为空")
        private Boolean received;
        /**
         * 售后原因编码
         */
        @NotBlank(message = "售后原因编码不能为空")
        private String reasonCode;
        /**
         * 售后原因说明
         */
        @NotBlank(message = "售后原因说明不能为空")
        private String reasonName;
        /**
         * 申请退款金额（商品平台成本价）
         */
        private BigDecimal applyRefundAmount;
    }

    /**
     * 用户信息
     */
    @Data
    public static class CustomerInfo {

        /**
         * 联系人手机(与电话必填其一)
         */
        @NotBlank(message = "联系人手机号不能为空")
        @Phone(message = "联系人手机号格式错误")
        private String customerMobilePhone;
        /**
         * 联系人Email
         */
        private String customerEmail;
        /**
         * 联系人邮编
         */
        private String customerPostcode;
        /**
         * 联系人
         */
        @NotBlank(message = "联系人不能为空")
        private String customerContactName;
    }

    /**
     * 取件信息
     */
    @Data
    public static class PickupWareInfoDTO {
        /**
         * 取件方式
         */
        @NotNull(message = "取件方式不能为空")
        private Integer pickupType;
        /**
         * 取件 省
         */
        @NotNull(message = "取件省不能为空")
        private String pickupProvinceCode;
        /**
         * 取件 省名称
         */
        private String pickupProvinceName;
        /**
         * 取件 市
         */
        @NotNull(message = "取件市不能为空")
        private String pickupCityCode;
        /**
         * 取件 市名称
         */
        private String pickupCityName;
        /**
         * 取件 县
         */
        @NotNull(message = "取件县不能为空")
        private String pickupCountyCode;
        /**
         * 取件 县名称
         */
        private String pickupCountyName;
        /**
         * 取件乡镇
         */
        private String pickupTownCode;
        /**
         * 取件乡镇名称
         */
        private String pickupTownName;
        /**
         * 取件街道地址
         */
        @NotBlank(message = "取件详细地址不能为空")
        private String pickupAddress;
        /**
         * 预约取件开始时间 2014-09-23 19:00:00
         */
        private LocalDateTime reservationStartTime;
        /**
         * 预约取件结束时间 2014-09-23 19:00:00
         */
        private LocalDateTime reservationEndTime;
    }

    /**
     * 返件信息
     */
    @Data
    public static class ReturnWareInfoDTO {
        /**
         * 返件方式
         */
        private Integer returnType;
        /**
         * 返件省
         */
        @NotNull(message = "返件省不能为空")
        private String returnProvinceCode;
        /**
         * 返件省名称
         */
        private String returnProvinceName;
        /**
         * 返件市
         */
        @NotNull(message = "返件市不能为空")
        private String returnCityCode;
        /**
         * 返件市名称
         */
        private String returnCityName;
        /**
         * 返件县
         */
        @NotNull(message = "返件县不能为空")
        private String returnCountyCode;
        /**
         * 返件县名称
         */
        private String returnCountyName;
        /**
         * 返件乡镇
         */
        private String returnTownCode;
        /**
         * 返件乡镇名称
         */
        private String returnTownName;
        /**
         * 返件街道地址
         */
        @NotBlank(message = "返件详细地址不能为空")
        private String returnAddress;
    }
}
